package ru.emms.codemeter.forms;

import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.module.Module;
import com.intellij.uiDesigner.core.GridConstraints;
import com.intellij.uiDesigner.core.GridLayoutManager;
import com.intellij.uiDesigner.core.Spacer;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by IntelliJ IDEA.
 * User: nastya.kuz
 * Date: 28.07.2010
 * Time: 16:56:19
 * Окно добавить/удалить модули
 */
public class AddModuleForm {

    private JTable addModuleTable;
    private JButton closeButton;
    private JButton okButton;
    private JPanel rootPanel;
    private Logger log = Logger.getInstance(getClass().getName());
    private ResultViewForm resultViewForm;
    private Object[][] data;
    private DefaultTableModel addModuleTableModel;
    private JFrame frame;
    private ArrayList<Module> selectedModules;
    private ArrayList<Module> allModules;

    /**
     * Конструктор формы, инициализирует поля, описывает реакцию на кнопки
     *
     * @param allModules      все модули данного проекта
     * @param selectedModules все ВЫБРАННЫЕ модули данного проекта
     * @param resultViewForm  ссылка на ResultViewForm, из которой вызывается данная форма
     * @param frame           ссылка на фрейм, в котором лежит форма
     */
    public AddModuleForm(List<Module> allModules, List<Module> selectedModules, ResultViewForm resultViewForm, JFrame frame) {
        this.selectedModules = new ArrayList<Module>(selectedModules);
        this.allModules = new ArrayList<Module>(allModules);
        //TODO это присваивание оставили потому, что по нажатию кнопики ОК вызывается метод формы ResultViewForm
        this.resultViewForm = resultViewForm;
        this.frame = frame;
        int rowCount = this.allModules.size();
        data = new Object[rowCount][2];
        initDataVector(data);

        String[] headers = {" ", "Имя модуля"};
        addModuleTableModel = new DefaultTableModel(data, headers) {
            public Class<?> getColumnClass(int columnIndex) {
                if (columnIndex == 0) {
                    return Boolean.class;
                } else {
                    return String.class;
                }
            }

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return columnIndex == 0;
            }
        };
        addModuleTable.setModel(addModuleTableModel);
        okButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                changeListSelectedModules();
            }
        });
        closeButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                addModuleTable.setModel(addModuleTableModel);
                closeFrame();
            }
        });
        addModuleTable.addFocusListener(new FocusAdapter() {
            @Override
            public void focusGained(FocusEvent e) {
                super.focusGained(e);
            }
        });
    }

    /**
     * закрывает форму
     */
    private void closeFrame() {
        frame.setVisible(false);
    }

    /**
     * Инициализирует массив всеми модулями проекта
     *
     * @param dataVector инициализируемый иассив
     */

    private void initDataVector(Object[][] dataVector) {
        int index = 0;
        for (Module module : allModules) {
            dataVector[index][0] = selectedModules.contains(module);
            dataVector[index][1] = module.getName();
            index++;
        }
    }

    /**
     * передает информацию о выбранных модулях в ResulViewForm
     */
    private void changeListSelectedModules() {
        List<Module> selectedModules = createListSelectedModules();
        resultViewForm.setSelectedModules(selectedModules);
        frame.setVisible(false);
        resultViewForm.setVersions(selectedModules);
    }

    /**
     * @return список выбранных модулей
     */
    private List<Module> createListSelectedModules() {
        List<Module> selectedModules = new ArrayList<Module>();
        for (int i = 0; i < data.length; i++) {
            Boolean isModuleSelected = (Boolean) addModuleTableModel.getValueAt(i, 0);
            if (isModuleSelected) {
                selectedModules.add(this.allModules.get(i));
            }
        }
        log.info("выбрано модулей: " + selectedModules.size());
        return selectedModules;
    }

    public JPanel getRootPanel() {
        return rootPanel;
    }


    {
// GUI initializer generated by IntelliJ IDEA GUI Designer
// >>> IMPORTANT!! <<<
// DO NOT EDIT OR ADD ANY CODE HERE!
        $$$setupUI$$$();
    }

    /**
     * Method generated by IntelliJ IDEA GUI Designer
     * >>> IMPORTANT!! <<<
     * DO NOT edit this method OR call it in your code!
     */
    private void $$$setupUI$$$() {
        rootPanel = new JPanel();
        rootPanel.setLayout(new GridLayoutManager(1, 1, new Insets(0, 0, 0, 0), -1, -1));
        final JPanel panel1 = new JPanel();
        panel1.setLayout(new GridLayoutManager(2, 1, new Insets(0, 0, 0, 0), -1, -1));
        rootPanel.add(panel1, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false));
        final JScrollPane scrollPane1 = new JScrollPane();
        panel1.add(scrollPane1, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, null, null, null, 0, false));
        addModuleTable = new JTable();
        addModuleTable.setEditingColumn(-1);
        addModuleTable.setEditingRow(-1);
        scrollPane1.setViewportView(addModuleTable);
        final JPanel panel2 = new JPanel();
        panel2.setLayout(new GridLayoutManager(1, 3, new Insets(0, 0, 0, 0), -1, -1));
        panel1.add(panel2, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false));
        closeButton = new JButton();
        closeButton.setText("Отмена");
        closeButton.setMnemonic('О');
        closeButton.setDisplayedMnemonicIndex(0);
        panel2.add(closeButton, new GridConstraints(0, 2, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        okButton = new JButton();
        okButton.setText("ОК");
        okButton.setMnemonic('К');
        okButton.setDisplayedMnemonicIndex(1);
        panel2.add(okButton, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
        final Spacer spacer1 = new Spacer();
        panel2.add(spacer1, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, 1, null, null, null, 0, false));
    }

    /** @noinspection ALL */
    public JComponent $$$getRootComponent$$$() {
        return rootPanel;
    }
}
